package net.lucamasini.fantacalcio.server.servlet;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceException;
import javax.servlet.ServletException;

import net.lucamasini.fantacalcio.server.model.Squadra;
import net.lucamasini.fantacalcio.server.service.SquadraService;

import org.springframework.orm.jpa.JpaCallback;
import org.springframework.orm.jpa.JpaTemplate;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

public class SquadraServlet extends RemoteServiceServlet implements
		SquadraService {

	private static final long serialVersionUID = 1L;

	private JpaTemplate template;
	
	@Override
	public void init() throws ServletException {
		template = (JpaTemplate) getServletContext().getAttribute(EntityManagerFactoryListener.JPATEMPLATE);
		
		if( template==null ) {
			throw new ServletException("ATTENZIONE: template non trovato nel ServletContext, verificare che web.xml sia configurato correttamente.");
		}
	}
	
	@Override
	public void destroy() {
		template = null;
	}
	
	@Override
	public List<Squadra> creaSquadra(Squadra newSquadra) {
		template.persist(newSquadra);
		
		return findAllSquadre();
	}

	//TODO: qui se uso un JPATemplate con merge per fare una transazione unica il DataStore
	//      fa rollback
	@Override
	public List<Squadra> aggiornaSquadre(final List<Squadra> squadre) {
		
		for(Squadra squadra: squadre) {
			template.merge(squadra);
		}
		
		return findAllSquadre();
	}

	//TODO: in questo caso la lista ritornata dalla query contiene entit� lazy, cosa che non mi risulta
	//		faccia parte di JPA, da vedere come fare senza copia che � costosa in termini computazionali
	@SuppressWarnings("unchecked")
	@Override
	public List<Squadra> findAllSquadre() {
		return template.executeFind(new JpaCallback<List<Squadra>>() {

			@Override
			public List<Squadra> doInJpa(EntityManager em) throws PersistenceException {
				@SuppressWarnings("rawtypes")
				final List query = em.createQuery("select s from Squadra s").getResultList();
				final List<Squadra> retVal = new ArrayList<Squadra>(query.size());
				retVal.addAll(query);
				return retVal;
			}
		});
	}

	@Override
	public List<Squadra> cancellaSquadra(final Squadra oldSquadra) {
		
		template.execute(new JpaCallback<List<Squadra>>() {

			@Override
			public List<Squadra> doInJpa(EntityManager em) throws PersistenceException {
				
				Squadra toBeDeleted = em.find(Squadra.class,
						oldSquadra.getId());
				em.remove(toBeDeleted);
				
				return null;
			}
		});
		
		return findAllSquadre();
	}
}
